#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=205;
int f[N][N][N];
int dp[N][N];
int sz[N];
int v[N];
int w[N];
int main()
{
	IOS;
	int n,m;
	cin>>n>>m;
	int idx=0;
	for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
	for(int i=1;i<=m;i++)
	{
		int num;
		cin>>num;
		if(m-i+1<=n)
		{
			idx++;
			sz[idx]=num;
		}
    }
	
	for(int l=1;l<=n;l++)
	{
		for(int r=l;r<=n;r++)
		{
			for(int z=200;z>=0;z--)
			{
				f[z][l][r]=f[z][l][r-1];
			}
			for(int z=200;z>=v[r];z--)
			{
				f[z][l][r]=max(f[z][l][r],f[z-v[r]][l][r-1]+w[r]);
			}
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=idx;j++)
		{
			for(int k=i+1;k>=1;k--)
			{
				dp[i][j]=max(dp[i][j],dp[k-1][j]);
				dp[i][j]=max(dp[i][j],dp[k-1][j-1]+f[sz[j]][k][i]);
			}
		}
	}

    int ans=dp[n][idx];

    cout<<ans;
    
	return 0;
}

